// /*******************************************************************************
//  * Copyright (c) 2012, 2017 IBM Corp.
//  *
//  * All rights reserved. This program and the accompanying materials
//  * are made available under the terms of the Eclipse Public License v1.0
//  * and Eclipse Distribution License v1.0 which accompany this distribution.
//  *
//  * The Eclipse Public License is available at
//  *   http://www.eclipse.org/legal/epl-v10.html
//  * and the Eclipse Distribution License is available at
//  *   http://www.eclipse.org/org/documents/edl-v10.php.
//  *
//  * Contributors:
//  *    Ian Craggs - initial contribution
//  *******************************************************************************/

// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
// #include "MQTTClient.h"
// #include "cJSON.h"

// #define ADDRESS "tcp://192.168.51.247:1883"
// #define CLIENTID "ExampleClientSub"
// #define TOPIC "down"
// #define PAYLOAD "Hello World!"
// #define QOS 1
// #define TIMEOUT 10000L

// volatile MQTTClient_deliveryToken deliveredtoken;

// void delivered(void *context, MQTTClient_deliveryToken dt)
// {
//     printf("Message with token value %d delivery confirmed\n", dt);
//     deliveredtoken = dt;
// }

// int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
// {
//     int i;
//     char *payloadptr;

//     printf("Message arrived\n");
//     printf("     topic: %s\n", topicName);
//     printf("   message: ");

//     payloadptr = message->payload;
//     for (i = 0; i < message->payloadlen; i++)
//     {
//         putchar(*payloadptr++);
//     }
//     putchar('\n');

//     cJSON *root = cJSON_Parse((char *)message->payload);

//     if (root == NULL)
//     {
//         printf("parse json failed\n");
//         return -1;
//     }
//     cJSON *name = cJSON_GetObjectItem(root, "name");
//     printf("name is : %s\n", name->valuestring);
//     cJSON *age = cJSON_GetObjectItem(root, "age");
//     printf("age is : %d\n", age->valueint);
//     cJSON *msg = cJSON_GetObjectItem(root, "msg");
//     printf("msg is : %s\n", msg->valuestring);

//    // 释放内存
//     cJSON_Delete(root);
    
//     MQTTClient_freeMessage(&message);
//     MQTTClient_free(topicName);

//     return 1;
// }

// void connlost(void *context, char *cause)
// {
//     printf("\nConnection lost\n");
//     printf("     cause: %s\n", cause);
// }

// int main(int argc, char *argv[])
// {
//     MQTTClient client;
//     MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
//     int rc;
//     int ch;
//     MQTTClient_deliveryToken token;
//     MQTTClient_message pubmsg = MQTTClient_message_initializer;

//     MQTTClient_create(&client, ADDRESS, CLIENTID,
//                       MQTTCLIENT_PERSISTENCE_NONE, NULL);
//     conn_opts.keepAliveInterval = 20;
//     conn_opts.cleansession = 1;

//     MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);

//     if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
//     {
//         printf("Failed to connect, return code %d\n", rc);
//         exit(EXIT_FAILURE);
//     }
//     printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
//            "Press Q<Enter> to quit\n\n",
//            TOPIC, CLIENTID, QOS);
//     MQTTClient_subscribe(client, TOPIC, QOS);

//     cJSON *root = cJSON_CreateObject();

//     cJSON_AddItemToObject(root, "name", cJSON_CreateString("zhangsan"));
//     cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(14));
//     cJSON_AddItemToObject(root, "msg", cJSON_CreateString("hello world"));

//     char buf[32] = {0};

//     while (1)
//     {
//         scanf("%s", buf);

//         if (strcmp(buf, "q") == 0)
//             return 0;

//         cJSON_ReplaceItemInObject(root, "msg", cJSON_CreateString(buf));
//         char *json = cJSON_PrintUnformatted(root);
//         printf("%s\n", json);
//         pubmsg.payload = json;
//         pubmsg.payloadlen = strlen(json);
//         pubmsg.qos = QOS;
//         pubmsg.retained = 0;
//         MQTTClient_publishMessage(client, "up", &pubmsg, &token);

//         printf("Waiting for up to %d seconds for publication of %s\n"
//                "on topic %s for client with ClientID: %s\n",
//                (int)(TIMEOUT / 1000), buf, TOPIC, CLIENTID);
//         rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
//     }

//     MQTTClient_unsubscribe(client, TOPIC);
//     MQTTClient_disconnect(client, 10000);
//     MQTTClient_destroy(&client);
//     return rc;
// }
